home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / OldSrc / CH10 / SRC / SURFACE1.FRM < prev    next >
Text File  |  1996-05-02  |  16KB  |  588 lines

  1. VERSION 4.00
  2. Begin VB.Form SurfaceForm 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H00C0C0C0&
  5.    Caption         =   "Surfaces"
  6.    ClientHeight    =   5700
  7.    ClientLeft      =   300
  8.    ClientTop       =   855
  9.    ClientWidth     =   9090
  10.    BeginProperty Font 
  11.       name            =   "MS Sans Serif"
  12.       charset         =   1
  13.       weight          =   700
  14.       size            =   8.25
  15.       underline       =   0   'False
  16.       italic          =   0   'False
  17.       strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    Height          =   6390
  21.    KeyPreview      =   -1  'True
  22.    Left            =   240
  23.    LinkTopic       =   "Form1"
  24.    ScaleHeight     =   5700
  25.    ScaleWidth      =   9090
  26.    Top             =   225
  27.    Width           =   9210
  28.    Begin VB.CheckBox ShowAxesCheck 
  29.       Caption         =   "Show Axes"
  30.       Height          =   255
  31.       Left            =   7080
  32.       TabIndex        =   16
  33.       Top             =   3360
  34.       Width           =   2055
  35.    End
  36.    Begin VB.OptionButton Choice 
  37.       Caption         =   "Saddle"
  38.       Height          =   255
  39.       Index           =   8
  40.       Left            =   7080
  41.       TabIndex        =   15
  42.       Top             =   2880
  43.       Width           =   2055
  44.    End
  45.    Begin VB.OptionButton Choice 
  46.       Caption         =   "Cone"
  47.       Height          =   255
  48.       Index           =   7
  49.       Left            =   7080
  50.       TabIndex        =   14
  51.       Top             =   2520
  52.       Width           =   2055
  53.    End
  54.    Begin VB.OptionButton Choice 
  55.       Caption         =   "Holes"
  56.       Height          =   255
  57.       Index           =   6
  58.       Left            =   7080
  59.       TabIndex        =   13
  60.       Top             =   2160
  61.       Width           =   2055
  62.    End
  63.    Begin VB.TextBox PhiText 
  64.       Height          =   285
  65.       Left            =   3600
  66.       TabIndex        =   12
  67.       Text            =   "0.1570"
  68.       Top             =   5400
  69.       Width           =   855
  70.    End
  71.    Begin VB.TextBox ThetaText 
  72.       Height          =   285
  73.       Left            =   2040
  74.       TabIndex        =   10
  75.       Text            =   "0.6283"
  76.       Top             =   5400
  77.       Width           =   855
  78.    End
  79.    Begin VB.TextBox RText 
  80.       Height          =   285
  81.       Left            =   480
  82.       TabIndex        =   8
  83.       Text            =   "10"
  84.       Top             =   5400
  85.       Width           =   855
  86.    End
  87.    Begin VB.OptionButton Choice 
  88.       Caption         =   "Hemisphere"
  89.       Height          =   255
  90.       Index           =   5
  91.       Left            =   7080
  92.       TabIndex        =   7
  93.       Top             =   1800
  94.       Width           =   2055
  95.    End
  96.    Begin VB.OptionButton Choice 
  97.       Caption         =   "Randomized Ridges"
  98.       Height          =   255
  99.       Index           =   4
  100.       Left            =   7080
  101.       TabIndex        =   6
  102.       Top             =   1440
  103.       Width           =   2055
  104.    End
  105.    Begin VB.OptionButton Choice 
  106.       Caption         =   "Ridges"
  107.       Height          =   255
  108.       Index           =   3
  109.       Left            =   7080
  110.       TabIndex        =   5
  111.       Top             =   1080
  112.       Width           =   2055
  113.    End
  114.    Begin VB.OptionButton Choice 
  115.       Caption         =   "Bowl"
  116.       Height          =   255
  117.       Index           =   2
  118.       Left            =   7080
  119.       TabIndex        =   4
  120.       Top             =   720
  121.       Width           =   2055
  122.    End
  123.    Begin VB.OptionButton Choice 
  124.       Caption         =   "Mounds"
  125.       Height          =   255
  126.       Index           =   1
  127.       Left            =   7080
  128.       TabIndex        =   3
  129.       Top             =   360
  130.       Width           =   2055
  131.    End
  132.    Begin VB.OptionButton Choice 
  133.       Caption         =   "Splash"
  134.       Height          =   255
  135.       Index           =   0
  136.       Left            =   7080
  137.       TabIndex        =   2
  138.       Top             =   0
  139.       Value           =   -1  'True
  140.       Width           =   2055
  141.    End
  142.    Begin VB.PictureBox Pict 
  143.       AutoRedraw      =   -1  'True
  144.       Height          =   5295
  145.       Left            =   0
  146.       ScaleHeight     =   349
  147.       ScaleMode       =   3  'Pixel
  148.       ScaleWidth      =   461
  149.       TabIndex        =   0
  150.       Top             =   0
  151.       Width           =   6975
  152.    End
  153.    Begin MSComDlg.CommonDialog LoadDialog 
  154.       Left            =   7080
  155.       Top             =   4560
  156.       _version        =   65536
  157.       _extentx        =   847
  158.       _extenty        =   847
  159.       _stockprops     =   0
  160.       cancelerror     =   -1  'True
  161.    End
  162.    Begin VB.Label Label1 
  163.       Caption         =   "Phi"
  164.       Height          =   255
  165.       Index           =   2
  166.       Left            =   3240
  167.       TabIndex        =   11
  168.       Top             =   5400
  169.       Width           =   375
  170.    End
  171.    Begin VB.Label Label1 
  172.       Caption         =   "Theta"
  173.       Height          =   255
  174.       Index           =   1
  175.       Left            =   1440
  176.       TabIndex        =   9
  177.       Top             =   5400
  178.       Width           =   495
  179.    End
  180.    Begin VB.Label Label1 
  181.       Caption         =   "R"
  182.       Height          =   255
  183.       Index           =   0
  184.       Left            =   240
  185.       TabIndex        =   1
  186.       Top             =   5400
  187.       Width           =   255
  188.    End
  189.    Begin VB.Menu mnuFile 
  190.       Caption         =   "&File"
  191.       Begin VB.Menu mnuFileLoad 
  192.          Caption         =   "&Load..."
  193.          Shortcut        =   ^L
  194.       End
  195.       Begin VB.Menu mnuFileSaveAs 
  196.          Caption         =   "&Save As..."
  197.          Shortcut        =   ^A
  198.       End
  199.       Begin VB.Menu mnuFileSep 
  200.          Caption         =   "-"
  201.       End
  202.       Begin VB.Menu mnuFileExit 
  203.          Caption         =   "E&xit"
  204.       End
  205.    End
  206. End
  207. Attribute VB_Name = "SurfaceForm"
  208. Attribute VB_Creatable = False
  209. Attribute VB_Exposed = False
  210. Option Explicit
  211.  
  212. ' Location of viewing eye.
  213. Dim EyeR As Single
  214. Dim EyeTheta As Single
  215. Dim EyePhi As Single
  216.  
  217. Const Dtheta = PI / 20
  218. Const Dphi = PI / 20
  219. Const Dr = 1
  220.  
  221. ' Location of focus point.
  222. Const FocusX = 0#
  223. Const FocusY = 0#
  224. Const FocusZ = 0#
  225.  
  226. Dim Projector(1 To 4, 1 To 4) As Single
  227.  
  228. Dim ThePicture As ObjPicture
  229.  
  230. Dim ShowingParameters As Boolean
  231.  
  232. Dim ChoiceNum As Integer
  233.  
  234. ' *******************************************************
  235. ' Rotate the points in the cube and draw the cube.
  236. ' *******************************************************
  237. Private Sub DrawData(pic As Object)
  238. Dim x As Single
  239. Dim y As Single
  240. Dim z As Single
  241. Dim S(1 To 4, 1 To 4) As Single
  242. Dim t(1 To 4, 1 To 4) As Single
  243. Dim ST(1 To 4, 1 To 4) As Single
  244. Dim PST(1 To 4, 1 To 4) As Single
  245.  
  246.     MousePointer = vbHourglass
  247.     Refresh
  248.     
  249.     ' Prevent overflow errors when drawing lines
  250.     ' too far out of bounds.
  251.     On Error Resume Next
  252.     
  253.     ' Scale and translate so it looks OK in pixels.
  254.     m3Scale S, 35, -35, 1
  255.     m3Translate t, 230, 175, 0
  256.     m3MatMultiplyFull ST, S, t
  257.     m3MatMultiplyFull PST, Projector, ST
  258.     
  259.     ' Transform the points.
  260.     ThePicture.ApplyFull PST
  261.  
  262.     ' Display the data.
  263.     pic.Cls
  264.     ThePicture.Draw pic, EyeR
  265.     pic.Refresh
  266.  
  267.     ' Display the viewnig parameters.
  268.     ShowViewingParameters
  269.  
  270.     MousePointer = vbDefault
  271. End Sub
  272.  
  273. Sub ShowViewingParameters()
  274.     ShowingParameters = True
  275.     
  276.     RText.Text = Format$(EyeR, "0.0000")
  277.     ThetaText.Text = Format$(EyeTheta, "0.0000")
  278.     PhiText.Text = Format$(EyePhi, "0.0000")
  279.     
  280.     RText.Refresh
  281.     ThetaText.Refresh
  282.     PhiText.Refresh
  283.  
  284.     ShowingParameters = False
  285. End Sub
  286.  
  287. Private Sub Choice_Click(Index As Integer)
  288.     ChoiceNum = Index
  289.     CreateData (ShowAxesCheck.value = vbChecked)
  290.     DrawData Pict
  291.     Pict.SetFocus
  292. End Sub
  293.  
  294. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  295.     Select Case KeyCode
  296.         Case vbKeyLeft
  297.             EyeTheta = EyeTheta - Dtheta
  298.         
  299.         Case vbKeyRight
  300.             EyeTheta = EyeTheta + Dtheta
  301.         
  302.         Case vbKeyUp
  303.             EyePhi = EyePhi - Dphi
  304.         
  305.         Case vbKeyDown
  306.             EyePhi = EyePhi + Dphi
  307.                 
  308.         Case Else
  309.             Exit Sub
  310.     End Select
  311.  
  312.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  313.     DrawData Pict
  314. End Sub
  315.  
  316.  
  317. Private Sub Form_KeyPress(KeyAscii As Integer)
  318.     Select Case KeyAscii
  319.         Case Asc("+")
  320.             EyeR = EyeR + Dr
  321.         
  322.         Case Asc("-")
  323.             EyeR = EyeR - Dr
  324.         
  325.         Case Else
  326.             Exit Sub
  327.     End Select
  328.  
  329.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  330.     DrawData Pict
  331. End Sub
  332.  
  333. Private Sub Form_Load()
  334.     ' Initialize the eye position.
  335.     EyeR = 10
  336.     EyeTheta = PI * 0.2
  337.     EyePhi = PI * 0.1
  338.     
  339.     ' Initialize the projection transformation.
  340.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  341.     
  342.     ' Create the data.
  343.     CreateData (ShowAxesCheck.value = vbChecked)
  344.  
  345.     ' Project and draw the data.
  346.     Me.Show
  347.     DrawData Pict
  348. End Sub
  349.  
  350. ' ************************************************
  351. ' Create the surface.
  352. ' ************************************************
  353. Sub CreateData(show_axes As Boolean)
  354. Const Xmin = -5
  355. Const Zmin = -5
  356. Const Dx = 0.3
  357. Const Dz = 0.3
  358. Const NumX = -2 * Xmin / Dx
  359. Const NumZ = -2 * Zmin / Dz
  360. Const Amp = 0.25
  361. Const Per = 2 * PI / 4
  362. Const Amp2 = 1
  363. Const Per2 = 2 * PI / 16
  364. Const Amp3 = 2
  365.  
  366. Dim grid As ObjGrid3D
  367. Dim axis As ObjPolyline
  368. Dim i As Integer
  369. Dim j As Integer
  370. Dim x As Single
  371. Dim y As Single
  372. Dim z As Single
  373. Dim D As Single
  374. Dim R2 As Single
  375. Dim x1 As Single
  376. Dim z1 As Single
  377. Dim x2 As Single
  378. Dim z2 As Single
  379.  
  380.     MousePointer = vbHourglass
  381.     Refresh
  382.     
  383.     Set ThePicture = New ObjPicture
  384.     Set grid = New ObjGrid3D
  385.     grid.SetBounds Xmin, Dx, NumX, Zmin, Dz, NumZ
  386.     ThePicture.objects.Add grid
  387.  
  388.     If show_axes Then
  389.         Set axis = New ObjPolyline
  390.         ThePicture.objects.Add axis
  391.         axis.AddSegment 0, 0, 0, 5.5, 0, 0
  392.         axis.AddSegment 0, 0, 0, 0, 3, 0
  393.         axis.AddSegment 0, 0, 0, 0, 0, 5.5
  394.     End If
  395.  
  396.     R2 = (Xmin + 3 * Dx) * (Xmin + 3 * Dx)
  397.     x = Xmin
  398.     For i = 1 To NumX
  399.         z = Zmin
  400.         For j = 1 To NumZ
  401.             Select Case ChoiceNum
  402.                 Case 0  ' Splash.
  403.                     D = Sqr(x * x + z * z)
  404.                     y = Amp * Cos(3 * D)
  405.                 
  406.                 Case 1  ' Mounds.
  407.                     y = Amp * (Cos(Per * x) + Cos(Per * z))
  408.                 
  409.                 Case 2  ' Bowl.
  410.                     y = 0.2 * (x * x + z * z) - 5#
  411.                 
  412.                 Case 3  ' Ridges.
  413.                     y = Amp2 * Cos(Per2 * x) + Amp3 * Cos(Per * z) / (Abs(z) / 3 + 1)
  414.             
  415.                 Case 4  ' Random ridges.
  416.                     y = Amp2 * Cos(Per2 * x) + Amp3 * Cos(Per * z) / (Abs(z) / 3 + 1) + Amp * Rnd
  417.             
  418.                 Case 5  ' Hemisphere.
  419.                     D = x * x + z * z
  420.                     If D >= R2 Then
  421.                         y = 0
  422.                     Else
  423.                         y = Sqr(R2 - D)
  424.                     End If
  425.                 
  426.                 Case 6  ' Holes.
  427.                     x1 = (x + Xmin / 2)
  428.                     z1 = (z + Xmin / 2)
  429.                     x2 = (x - Xmin / 2)
  430.                     z2 = (z - Xmin / 2)
  431.                     y = Amp3 - _
  432.                 1 / (x1 * x1 + z1 * z1 + 0.1) - _
  433.                 1 / (x2 * x2 + z1 * z1 + 0.1) - _
  434.                 1 / (x1 * x1 + z2 * z2 + 0.1) - _
  435.                 1 / (x2 * x2 + z2 * z2 + 0.1)
  436.             
  437.                 Case 7  ' Cone.
  438.                     D = 2 * (Amp3 - Sqr(x * x + z * z))
  439.                     If D < -Amp3 Then D = -Amp3
  440.                     y = D
  441.             
  442.                 Case 8  ' Saddle.
  443.                     y = (x * x - z * z) / 10
  444.                 
  445.             End Select
  446.             
  447.             grid.SetValue x, y, z
  448.             z = z + Dz
  449.         Next j
  450.         x = x + Dx
  451.     Next i
  452.     
  453.     MousePointer = vbDefault
  454. End Sub
  455.  
  456. Private Sub mnuFileExit_Click()
  457.     Unload Me
  458. End Sub
  459.  
  460.  
  461. Private Sub mnuFileLoad_Click()
  462. Dim fname As String
  463. Dim filenum As Integer
  464. Dim txt As String
  465. Dim Xmin As Single
  466. Dim Ymin As Single
  467. Dim xmax As Single
  468. Dim ymax As Single
  469.  
  470.     ' Allow the user to pick a file.
  471.     On Error Resume Next
  472.     LoadDialog.filename = "*.APF"
  473.     LoadDialog.ShowOpen
  474.     If Err.Number = cdlCancel Then
  475.         Unload LoadDialog
  476.         Exit Sub
  477.     ElseIf Err.Number <> 0 Then
  478.         Unload LoadDialog
  479.         Beep
  480.         MsgBox "Error selecting file.", , vbExclamation
  481.         Exit Sub
  482.     End If
  483.     On Error GoTo 0
  484.     
  485.     fname = LoadDialog.filename
  486.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  487.         - Len(LoadDialog.FileTitle) - 1)
  488.  
  489.     ' Clear the picture.
  490.     Set ThePicture = Nothing
  491.     
  492.     ' Open the file.
  493.     filenum = FreeFile
  494.     Open fname For Input As #filenum
  495.     
  496.     ' Make sure it's an Object Picture File.
  497.     Input #filenum, txt
  498.     If txt <> "3D APF PICTURE" Then
  499.         Close filenum
  500.         Beep
  501.         MsgBox "Error reading file """ & fname & """.", , vbExclamation
  502.         Exit Sub
  503.     End If
  504.  
  505.     ' Read the picture.
  506.     Set ThePicture = New ObjPicture
  507.     ThePicture.FileInput filenum
  508.     
  509.     ' Close the file.
  510.     Close filenum
  511.  
  512.     ' Refresh the display.
  513.     DrawData Pict
  514.     
  515.     ' Deselect all the option buttons.
  516.     For ChoiceNum = 0 To 8
  517.         If Choice(ChoiceNum).value Then _
  518.             Choice(ChoiceNum).value = False
  519.     Next ChoiceNum
  520. End Sub
  521.  
  522. Private Sub mnuFileSaveAs_Click()
  523. Dim fname As String
  524. Dim filenum As Integer
  525.  
  526.     ' Allow the user to pick a file.
  527.     On Error Resume Next
  528.     LoadDialog.filename = "*.APF"
  529.     LoadDialog.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  530.     LoadDialog.ShowSave
  531.     If Err.Number = cdlCancel Then
  532.         Unload LoadDialog
  533.         Exit Sub
  534.     ElseIf Err.Number <> 0 Then
  535.         Unload LoadDialog
  536.         Beep
  537.         MsgBox "Error selecting file.", , vbExclamation
  538.         Exit Sub
  539.     End If
  540.     On Error GoTo 0
  541.     
  542.     fname = LoadDialog.filename
  543.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  544.         - Len(LoadDialog.FileTitle) - 1)
  545.     
  546.     ' Open the file.
  547.     filenum = FreeFile
  548.     Open fname For Output As #filenum
  549.     
  550.     ' Write the picture.
  551.     ThePicture.FileWrite filenum
  552.     
  553.     ' Close the file.
  554.     Close filenum
  555. End Sub
  556.  
  557.  
  558.  
  559.  
  560. Private Sub PhiText_Change()
  561.     If ShowingParameters Then Exit Sub
  562.     EyePhi = CSng(PhiText.Text)
  563.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  564.     DrawData Pict
  565. End Sub
  566.  
  567. Private Sub RText_Change()
  568.     If ShowingParameters Then Exit Sub
  569.     EyeR = CSng(RText.Text)
  570.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  571.     DrawData Pict
  572. End Sub
  573.  
  574.  
  575. Private Sub ShowAxesCheck_Click()
  576.     CreateData (ShowAxesCheck.value = vbChecked)
  577.     DrawData Pict
  578.     Pict.SetFocus
  579. End Sub
  580.  
  581. Private Sub ThetaText_Change()
  582.     If ShowingParameters Then Exit Sub
  583.     EyeTheta = CSng(ThetaText.Text)
  584.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  585.     DrawData Pict
  586. End Sub
  587.  
  588.